package cc.fine.svc.main.service.tbl;

import cc.fine.svc.main.bean.dto.VideoInfoDto;
import cc.fine.svc.main.bean.po.TblVideo;
import cc.fine.svc.main.bean.vo.VideoUploadVo;
import cc.fine.svc.main.bean.vo.VideoViewVo;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author wyihe
 * @since 2023-10-25
 */
public interface TblVideoService extends IService<TblVideo> {


    /**
     * 缓存VideoViewVo结果，
     * 是这个方法的结果 ：TblVideoService::getVideoViewVo
     * #30 表示过期时间10s
     */
    String VIEW_CACHE = "video::view";

    Integer VIEW_CACHE_TIME = 5;

    /**
     * 存储 video 相关数据的 Es index
     */
    String Es_Index = "video";

    /**
     * 上传视频
     * @param userId
     * @param videoVo
     */
    void upload(String userId, VideoUploadVo videoVo);

    /**
     * 获取一个视频的信息（包含点赞数、收藏数等等）
     * @param videoId
     * @return
     */
    VideoInfoDto getInfo(String videoId);

    /**
     * 获取用于展示的video信息
     * @param videoId
     * @return
     */
    VideoViewVo getVideoViewVo(String videoId, String userId);

    /**
     * 获取用于展示的video信息
     * @param videoIds
     * @return
     */
    List<VideoViewVo> getVideoViewVoBatch(List<String> videoIds, String userId);


    /**
     * 使用 es 索引视频
     * 降序
     * page 页数
     * limit 每页条数
     *
     * @param keyword
     * @return
     */
    List<Map<String, Object>> search(String keyword, Integer page, Integer limit);


    /**
     * 通过ip查找视频
     * @param ip
     * @param page
     * @param limit
     * @return
     */
    List<Map<String, Object>> searchForIp(String ip, Integer page, Integer limit);

    List<VideoInfoDto> getInfoBatch(List<String> videoIds);

    List<VideoInfoDto> publishVideoInfoList(String userId);

    /**
     * 按标签精准查找视频
     * @param tagId
     */
    List<Map<String, Object>> getInfoByTagId(String tagId, Integer page, Integer limit);

    /**
     * 通过视频id在Es中索引视频
     */
    List<Map<String, Object>> searchByVideoIds(List<String> videoIds);


    /**
     * 通过视频id在Es中索引视频
     */
    List<Map<String, Object>> searchByVideoIds(List<String> videoIds, Integer page, Integer limit);

    /**
     * 获取fan视频列表
     * @param userId
     * @param page
     * @param limit
     * @return
     */
    List<VideoViewVo> fanVideos(String userId, Integer page, Integer limit);


    /**
     * 删除视频
     * @param videoId
     */
    void removeVideo(String videoId);

}
